package main

import (
	"./fanglog"
	"net/http"
	"fmt"
	"io/ioutil"
	"encoding/json"
	"./conf"
	"os"
	"time"
	"strconv"
)

var (
	f_log  fanglog.Log
	config conf.Conf
)

func main() {

	// 加载配置
	config = conf.InitConf("conf.txt")

	//开启日志
	f_log = fanglog.InitLog("test.log")

	defer func() {
		if e := recover(); e != nil {
			f_log.Panic(e)
		}
		f_log.Close()
	}()

	go getFangInfo()

	for range config.Ticker() {
		go getFangInfo()
	}
}

// 个人房源信息
type Finfo struct {
	Id        string `json:"id"`
	Title     string `json:"title"`
	Creattime string `json:"creattime"`
	Updatetime string `json:"updatetime"` // updatetime 可能是用户最近的更新的时间
	Lucupdatetime string `json:"lucupdatetime"` //  365 房产用的是这个时间为发布时间 ：lucupdatetime
	Contactor string `json:"contactor"`
	Telno     string `json:"telno"`
}

// 获取房产信息
func getFangInfo() {
	fmt.Println("=========" + time.Now().Format("2006-01-02 15:04:05") + "===========")
	defer getErr()
	resp, err := http.Get("https://m.house365.com/index.php?m=home&c=Secondhouse&a=index&q=i1_j0_x0_m0_h0_f0_z0_o1_k&act=search&blockid=&city=nj")
	if err != nil {
		panic("url 获取失败")
	}
	defer resp.Body.Close()
	if resp.StatusCode != http.StatusOK {
		panic("url status code :" + strconv.Itoa(resp.StatusCode))
		return
	}

	all, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
		return
	}

	data := make([]Finfo, 1024)
	//fmt.Println(string(all))
	json.Unmarshal(all, &data)
	//fmt.Println(data)
	var (
		datetime = time.Now().Unix()
		f_info   = make(chan Finfo,10)
	)
	go saveInfo(f_info)
	one_day := int64(24 * 60 * 60)
	for _, info := range data {
		c_time,_ :=  strconv.Atoi(info.Creattime)
		l_time, _ := strconv.Atoi(info.Lucupdatetime)
		c_int := int64(c_time)
		l_int := int64(l_time)

		// 发布和页面搜索到的时间有一定时间差
		// 当前时间-发布时间 <= 查询间隔时间 + 60 && 发布时间-创建时间 <= 一天
		if datetime - l_int <= int64(config.Stime) + 60 &&  l_int - c_int <= one_day {
			f_info <- info
		}
	}
	close(f_info)
	fmt.Println("=========结束==========")
	fmt.Println("")
	fmt.Println("")
}

// 保存至文件
func saveInfo(f_info <-chan Finfo) {
	defer getErr()
	dir := "./365fang"
	b := isExist(dir)
	if !b {
		os.Mkdir(dir, os.ModePerm)
	}
	file_addr := "./365fang/" + time.Now().Format("2006-01-02 15:04:05") + ".txt"
	f, err := os.OpenFile(file_addr, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
	if err != nil {
		panic("文件创建失败：" + file_addr)
	}

	defer f.Close()
	var n int
	for {
		if info, ok := <-f_info; ok {
			n++
			f.WriteString("{\n")

			f.WriteString("标题    ：" + info.Title + "\n")
			f.WriteString("姓名    ：" + info.Contactor + "\n")
			f.WriteString("电话    ：" + info.Telno + "\n")

			n, _ := strconv.Atoi(info.Creattime)
			f.WriteString("创建时间 ：" + time.Unix(int64(n), 0).Format("2006-01-02 15:04:05") + "\n")

			n, _ = strconv.Atoi(info.Updatetime)
			f.WriteString("更新时间 ：" + time.Unix(int64(n), 0).Format("2006-01-02 15:04:05") + "\n")

			n, _ = strconv.Atoi(info.Lucupdatetime)
			f.WriteString("发布时间 ：" + time.Unix(int64(n), 0).Format("2006-01-02 15:04:05") + "\n")

			f.WriteString("链接地址 ：http://nj.sell.house365.com/s_" + info.Id + ".html\n")
			f.WriteString("}\n")
			f.WriteString("\n")
			f.WriteString("\n")
		} else if !ok {
			break
		}
	}
	if n == 0 {
		os.Remove(file_addr)
	}

}

//判断文件或文件夹是否存在
func isExist(path string)(bool){
	_, err := os.Stat(path)
	if err != nil{
		if os.IsExist(err){
			return true
		}
		if os.IsNotExist(err){
			return false
		}
		fmt.Println(err)
		return false
	}
	return true
}

// 最后的报错记录日志
func getErr() {
	if e := recover(); e != nil {
		f_log.Panic(e)
	}
}

